type equalityOp = NotEq | Eq
type inequalityOp = Greater | Less | Gte | Lte
type booleanOp = And | Or

type comparisonOp = 
	Eop of equalityOp
| 	Ieop of inequalityOp
| 	Bop of booleanOp

type incrementOp = Inc | Dec
type updateOp = MINUSEQ | TIMESEQ | DIVEQ
type numOp = MINUS | TIMES | DIVIDE
type mathOp = PLUS | MINUS | TIMES | DIVIDE | MOD

type typeKw = INT | FLOAT | STRING | BOOL
type boolKw = TRUE | FALSE
type numKw = INT | FLOAT
type incdec = INCREMENT | DECREMENT

type literal = 
  Bool of bool
| Int of int
| Float of float
| String of string


type expr =
	Literal of literal
| 	Id of string
| 	ParenExpr of expr
| 	FunctionCall of expr * expr list
| 	UnaryNot of expr
| 	UnaryNeg of expr
| 	UnaryNegInt of int
| 	DotAccess of expr * string
| 	CollectionIndex of expr * expr
| 	Comparison of expr * comparisonOp * expr
| 	Enum of expr list
| 	UpdateOp of expr * expr
| 	Binop of expr * mathOp * expr
| 	Collection of expr list
| 	RangeCollection of expr * expr
| 	IncDec of expr * incrementOp (*fixme*)
| 	IfStmt of expr * expr list (*fixme*)

(* struct, collection *)

type funcName = 
	FuncName of expr * expr list

type structEl = 
	StructEl of string * expr

(* type block = 
	Block of stmt list *)

type stmt = 
 	Expr of expr
| 	Return of expr
(*| 	VarAssignment of string * expr*)
(*| 	IncDec of expr * incrementOp*)
(* | 	IfStmt of expr * stmt list
 *)| 	ForLoop of expr * expr * stmt list (*fixme*)
(* funcassignment, rules, if, while, for*)

	
type identifier = 
	Identifier of string

type expression = 
	Integer of int
|	IdExpr of identifier 

type assignment = 
	Assignment of identifier * expression

type program =
	assignment list
	
	
	
	
	
	